GIT

https://git.gosuslugi.local/pgs2-rtlabs/source/endpoints-access-info/-/tree/master/


Назначение

Сервис для хранения таблицы маршрутизации запросов и прав доступов к эндпоинтам сервисов.
Принимает из сообщений кафки информацию об эндпоинтах сервиса и прав доступа к ним. Сохраняет эту информацию в postgres. Эта информация в дальнейшем используется сервисом proxy-gateway.

У сервиса нет собственных REST API контроллеров (rest api методов) - всё взаимодействие производится через KAFKA


БД

Сервис имеет собственную БД endpoints-access-info в Postgres с 1 таблицей access_info

Структура таблицы access_info:

Имя поля

Формат

Описание

Пример

idbigintprimary key
app_namevarchar(255)Имя приложения, должно быть равно имени его Service кубераnsi-registry
pkgvarchar(500)Абсолютный путь к java классу с контроллером, поле для информации, не участвует в логике.

sx.microservices.nsiregistry.controller.registry.RegistryController

methodvarchar(255)метод запроса - GET, POST и т.п.Get
ingress_pathvarchar(500)Базовый путь к приложению, то же самое что и сейчас у него в пути ingress./service/nsi-registry
pathvarchar(500)Путь к эндпоинту внутри приложения, например "/requests/example". Поддерживается wildcard, пример - "/request/*" - будет принимать любое значение на месте * Еще пример "/request/*/*"/registry/*/records
rulesjsonbJson с полями perms и roles, где perms - массив permissions, roles - массив ролей. Можно указать либо что-то одно либо ничего вообще.{"perms": null, "roles": null} - означает что для доступа достаточно лишь валидного токена, без разницы какие у него роли.
manualbooleanПоле для определения в ручную заполнен этот маршрут запросом в базу или автоматически сервисом enpoints-access-info-servicefalse
modifiedtimestampДата редактирования2023-03-21 10:10:10.287561
modified_byvarchar(255)Источник редактированияManual или AccessInfoService

Примеры скриптов для таблицы access-info

Примеры указаны без учёта требования отдела DBA по оформлению скриптов для релиза.

Полностью одинаковых (дублей) записей в таблице access_info делать не нужно.

Добавление новой записи:

В первую очередь рекомендуется проверить есть ли уже такая запись, чтобы не плодить дубли. Если такая запись уже есть - проверить актуальные ли права доступа в ней.
Скрипт добавления записи

INSERT INTO access_info(id,app_name,pkg,method,ingress_path,path,rules,manual) VALUES
(nextval('access_info_seq'),'ervu-application-gateway','Manual','Get','/service/ervu-application-gateway','/applicationInfo/getWithActive/*','{"perms": [], "roles": []}','true')


Обновление записи в таблице:

Обновление по id, задание прав доступа:
Скрипт обновления записи

UPDATE access_info
SET rules = '{"roles": ["Администратор облака"], "perms": "read_user"}'
WHERE id = 2000000000001

Удаление записи в таблице:

Для удаления лучше всего использовать id чтобы не удалить лишнего

Скрипт удаления записи

DELETE
FROM access_info
WHERE id = <ID>


KAFKA

 Взаимодействует только с топиком pgs.proxy.endpoints.access.info как consumer и producer

[
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.registry.RegistryController",
      "method": "Get",
      "ingressPath": "/service/nsi-registry",
      "path": "/registry/*/records",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.SocialOrganizationsINNController",
      "method": "Put",
      "ingressPath": "/service/nsi-registry",
      "path": "/socialorganizationsinn",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.SocialOrganizationsINNController",
      "method": "Get",
      "ingressPath": "/service/nsi-registry",
      "path": "/socialorganizationsinn",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.registry.RegistryController",
      "method": "Get",
      "ingressPath": "/service/nsi-registry",
      "path": "/registry/*/*",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.SocialOrganizationsINNController",
      "method": "Delete",
      "ingressPath": "/service/nsi-registry",
      "path": "/socialorganizationsinn",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.MCHSController",
      "method": "Post",
      "ingressPath": "/service/nsi-registry",
      "path": "/mchs",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.registry.RegistryController",
      "method": "Post",
      "ingressPath": "/service/nsi-registry",
      "path": "/registry/*",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.registry.RegistryController",
      "method": "Delete",
      "ingressPath": "/service/nsi-registry",
      "path": "/registry/*/*",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.AverageSalariesController",
      "method": "Post",
      "ingressPath": "/service/nsi-registry",
      "path": "/averagesalaries",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.ClassifierController",
      "method": "Get",
      "ingressPath": "/service/nsi-registry",
      "path": "/classifier",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.SocialOrganizationsINNController",
      "method": "Post",
      "ingressPath": "/service/nsi-registry",
      "path": "/socialorganizationsinn",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.MCHSController",
      "method": "Delete",
      "ingressPath": "/service/nsi-registry",
      "path": "/mchs",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.MCHSController",
      "method": "Get",
      "ingressPath": "/service/nsi-registry",
      "path": "/mchs",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.MCHSController",
      "method": "Put",
      "ingressPath": "/service/nsi-registry",
      "path": "/mchs",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.AverageSalariesController",
      "method": "Delete",
      "ingressPath": "/service/nsi-registry",
      "path": "/averagesalaries",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.registry.RegistryController",
      "method": "Get",
      "ingressPath": "/service/nsi-registry",
      "path": "/registry/*",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.registry.RegistryController",
      "method": "Put",
      "ingressPath": "/service/nsi-registry",
      "path": "/registry/*",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.AverageSalariesController",
      "method": "Put",
      "ingressPath": "/service/nsi-registry",
      "path": "/averagesalaries",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.registry.RegistryController",
      "method": "Delete",
      "ingressPath": "/service/nsi-registry",
      "path": "/registry/*",
      "rules": {}
   },
   {
      "appName": "nsi-registry",
      "pkg": "sx.microservices.nsiregistry.controller.AverageSalariesController",
      "method": "Get",
      "ingressPath": "/service/nsi-registry",
      "path": "/averagesalaries",
      "rules": {}
   }
]


Взаимодействие с proxy-gateway

Библиотека pgs-proxy-library на старте приложения находит все контроллеры с аннотацией PgsAccessRules, принимает из нее роли и permissions, формирует запись вида Method, Path, rules и отправляет через кафку в сервис endpoints-access-info, который сохраняет полную информацию о маршрутах в базу postgres актуализируя записи (если для этого сервиса записи уже есть - он их пересоздаст, таким образом поддерживается удаление и обновление ендпоинтов в таблице маршрутизации), при этом если у существующей записи стоит признак manual = true - то запись не будет обновлена либо удалена, это сделано для того, чтобы иметь возможность в ручную изменять записи и чтобы они после этого не перезаписывались автоматически.

Схема взаимодействия

Написать комментарий...